home *** CD-ROM | disk | FTP | other *** search
/ Experimental BBS Explossion 3 / Experimental BBS Explossion III.iso / c / bc_pas_1.zip / GETHW.ASM < prev    next >
Assembly Source File  |  1992-10-20  |  16KB  |  557 lines

  1. ;$Author:   DCODY  $
  2. ;$Date:   20 Oct 1992 09:58:38  $
  3. ;$Header:   X:/sccs/misc/gethw.asv   1.8   20 Oct 1992 09:58:38   DCODY  $
  4. ;$Log:   X:/sccs/misc/gethw.asv  $
  5. ;  
  6. ;     Rev 1.8   20 Oct 1992 09:58:38   DCODY
  7. ;  adjusted tiny model .data declaration
  8. ;  
  9. ;     Rev 1.7   15 Sep 1992 13:30:32   BCRANE
  10. ;  added NOINT2F ifdef for use in standalone environment
  11. ;  
  12. ;     Rev 1.6   14 Sep 1992 10:38:04   DCODY
  13. ;  changed docare mask bits to check a more general set of hardware
  14. ;  
  15. ;     Rev 1.5   31 Aug 1992 12:21:02   DCODY
  16. ;  the fourth board address was the third board! changed...
  17. ;  
  18. ;     Rev 1.4   24 Jul 1992 15:41:14   DCODY
  19. ;  The function now will search for the board in 4 locations if the
  20. ;  user passes in a 0 as the base address.
  21. ;  
  22. ;     Rev 1.3   20 Jul 1992 11:46:18   DCODY
  23. ;  Makes up to 4 passes to find the hardware at up to 4 I/O addresses.
  24. ;  
  25. ;     Rev 1.2   17 Jul 1992 14:02:32   DCODY
  26. ;  moved TheDMAChannel and TheIRQChannel into gethw. Also declared a copy
  27. ;  of mvtranslatecode in the code segment.
  28. ;  
  29. ;     Rev 1.1   23 Jun 1992 16:32:50   DCODY
  30. ;  PAS2 update
  31. ;  
  32. ;     Rev 1.0   15 Jun 1992 09:39:50   BCRANE
  33. ;  Initial revision.
  34. ;$Logfile:   X:/sccs/misc/gethw.asv  $
  35. ;$Modtimes$
  36. ;$Revision:   1.8  $
  37.  
  38.     Title    GetHW  --  Determine the Pro Audio Spectrum Version
  39.     Subttl    Copyright (c) 1991,1992. Media Vision, Inc. All Rights Reserved
  40.     page    64,131
  41.  
  42. ;   /*\
  43. ;---|*|----====< GetHW >====----
  44. ;---|*|
  45. ;---|*| Get the Pro Audio hardware device configuration, etc.
  46. ;---|*|
  47. ;   \*/
  48.  
  49.         .xlist
  50.     include model.inc
  51.         include common.inc
  52.     include masm.inc
  53.     include target.inc
  54.     .list
  55.  
  56. ;
  57. ;   /*\
  58. ;---|*|--------------------------==================--------------------------
  59. ;---|*|
  60. ;---|*|    The Pro AudioSpectrum Plus, Pro AudioSpectrum 16 and CDPC
  61. ;---|*|    all support relocatable I/O.  PAS hardware must occupy four
  62. ;---|*|    contiguous I/O locations.  All I/O accesses use those four addresses
  63. ;---|*|    and their 'harmonic' addresses.  Harmonic addresses are those
  64. ;---|*|    addresses that under normal circumstance would decode to the same
  65. ;---|*|    contiguous four I/O locations.  For example, harmonic addresses of
  66. ;---|*|    port 388h would include 788h, 1388h, 1788h, 1f88h, etc.
  67. ;---|*|
  68. ;---|*|    Most hardware will not conflict with the default address range of
  69. ;---|*|    388h-38Bh.  This address range is based on the I/O locations
  70. ;---|*|    chosen by Adlib and this range is supposed to be reserved for
  71. ;---|*|    SDLC or 2nd Bisynchronous communications hardware.  It has been
  72. ;---|*|    reported that an ISDN card decodes to this range also.  More
  73. ;---|*|    importantly, if a customer wants to have multiple sound cards
  74. ;---|*|    co-resident in his system, we must provide a means of relocating
  75. ;---|*|    the I/O range.
  76. ;---|*|
  77. ;---|*|    Media Vision's I/O relocation capability is software selectable to
  78. ;---|*|    any ONE of 64 4-address locations.  The possible locations are
  79. ;---|*|    depicted below:
  80. ;---|*|
  81. ;---|*|     0     2     4      6    8     A     C      E
  82. ;---|*|
  83. ;---|*|   200h    |<------------- game control------------------->|
  84. ;---|*|
  85. ;---|*|   210h    |<-- expansion unit -->|        |        |
  86. ;---|*|
  87. ;---|*|   220h    |<---- Sound Blaster decode #1 ---------------->|
  88. ;---|*|
  89. ;---|*|   230h    |<---- Sound Blaster decode #2 ---------------->|
  90. ;---|*|
  91. ;---|*|   240h    |<---- Sound Blaster decode #3 ---------------->|
  92. ;---|*|
  93. ;---|*|   250h    |<---PAS--->|<---PAS--->|<---PAS--->|<---PAS--->|
  94. ;---|*|
  95. ;---|*|   260h    |<---PAS--->|<---PAS--->|<---PAS--->|<---PAS--->|
  96. ;---|*|
  97. ;---|*|   270h    |<---PAS--->|          |<--3rd Parallel Printer->|
  98. ;---|*|
  99. ;---|*|   280h    |<---PAS--->|<---PAS--->|<---PAS--->|<---PAS--->|
  100. ;---|*|
  101. ;---|*|   290h    |<---PAS--->|<---PAS--->|<---PAS--->|<---PAS--->|
  102. ;---|*|
  103. ;---|*|   2A0h    |<---PAS--->|<---PAS--->|<---PAS--->|<---PAS--->|
  104. ;---|*|
  105. ;---|*|   2B0h    |<---PAS--->|<---PAS--->|<---PAS--->|<---PAS--->|
  106. ;---|*|
  107. ;---|*|   2C0h    |<---PAS--->|<---PAS--->|<---PAS--->|<---PAS--->|
  108. ;---|*|
  109. ;---|*|   2D0h    |<-----------     3270     PC    --------------->|
  110. ;---|*|
  111. ;---|*|   2E0h    |<---PAS--->|<---PAS--->|<---PAS--->|<---PAS--->|
  112. ;---|*|
  113. ;---|*|   2F0h    |<----- reserved ------>|<-Async comm. 2 ------.|
  114. ;---|*|
  115. ;---|*|     0     2     4      6    8     A     C      E
  116. ;---|*|
  117. ;---|*|   300h    |<401---------- Prototype card ---------------->|
  118. ;---|*|
  119. ;---|*|   310h    |<401---------- Prototype card ---------------->|
  120. ;---|*|
  121. ;---|*|   320h    |<401----------    hard disk   ---------------->|
  122. ;---|*|
  123. ;---|*|   330h    |<401---XT/3270-------->|<---PAS--->|<---PAS--->|
  124. ;---|*|
  125. ;---|*|   340h    |<401, PAS->|<---PAS--->|<---PAS--->|<---PAS--->|
  126. ;---|*|
  127. ;---|*|   350h    |<401, PAS->|<---PAS--->|<---PAS--->|<---PAS--->|
  128. ;---|*|
  129. ;---|*|   360h    |<401, PAS->|<---PAS--->|<---PAS--->|<---PAS--->|
  130. ;---|*|
  131. ;---|*|   370h    |<401, PAS->|          |<--2nd Parallel Printer->|
  132. ;---|*|
  133. ;---|*|   380h    |<401, PAS->|<---PAS--->|<---PAS--->|<---PAS--->|
  134. ;---|*|
  135. ;---|*|   390h    |<401, PAS->|<---PAS--->|<---PAS--->|<---PAS--->|
  136. ;---|*|
  137. ;---|*|   3A0h    |<401, PAS->|<---PAS--->|<---PAS--->|<---PAS--->|
  138. ;---|*|
  139. ;---|*|   3B0h    |<401, Monochrome Display and Parallel 1  ----->|
  140. ;---|*|
  141. ;---|*|   3C0h    |<401, ------------ VGA   --------------------->|
  142. ;---|*|
  143. ;---|*|   3D0h    |<401,-------     3270     PC    --------------->|
  144. ;---|*|
  145. ;---|*|   3E0h    |<401,    reserved ------>|<---- COM 3 serial---->|
  146. ;---|*|
  147. ;---|*|   3F0h    |<401,     Disk     ------>|<-- Asych comm. 1 ---->|
  148. ;---|*|
  149. ;---|*|
  150. ;---|*|
  151. ;---|*|   Note: 401 indicates one of the possible locations of the
  152. ;---|*|     MPU-401 MIDI interface.  It decodes at 3x0 - 3x1 where
  153. ;---|*|     x is an element of {0,1,2,3,4,5,6,7,8,9,a,b,c d,e,f}
  154. ;---|*|
  155. ;---|*|     SoundBlaster decode range is 2x0 thru 2xf where x is
  156. ;---|*|     an element of {2,3,4}
  157. ;---|*|
  158. ;---|*|
  159. ;---|*|   It requires very little effort to support the relocation of
  160. ;---|*|   the hardware if the routines provided here are used.    Once
  161. ;---|*|   the Pro AudioSpectrum chip has been located, any I/O address
  162. ;---|*|   can be relocated by XOR-ing the address (usually contained in)
  163. ;---|*|   the DX register) with a 16-bit variable.
  164. ;---|*|
  165. ;   \*/
  166. ;
  167.  
  168. ;
  169. ;---------------------------========================---------------------------
  170. ;---------------------------====< DATA SECTION >====---------------------------
  171. ;---------------------------========================---------------------------
  172. ;
  173.  
  174. if MODELSIZE eq 0
  175.     .code
  176. else
  177.     .data
  178. endif
  179.  
  180. ;
  181. ; The board base address for the original PAS card was based at 388. This will
  182. ; be XORed to the new address to derive a translation code. This code can be
  183. ; XORed back into any original PAS address resulting in the true card address.
  184. ;
  185.  
  186.     public    _MVTranslateCode
  187. _MVTranslateCode    dw    0    ; I/O base xor default_base
  188.  
  189.     public    _MVHWVersionBits
  190. _MVHWVersionBits    dw    -1    ; holds the product feature bits
  191.  
  192. VERSION_PAS             equ     0       ; Pro Audio Spectrum
  193. VERSION_PASPLUS     equ    1    ; Pro Audio Plus card
  194. VERSION_PAS16        equ    2    ; Pro Audio 16 card
  195. VERSION_CDPC        equ    3    ; CDPC card & unit
  196.  
  197. ;
  198. ; The following equates build up a mask of bits that we do wish to keep
  199. ; when comparing feature bits. The zero bits can be ignored, whereas, the
  200. ; the 1 bits must match.
  201. ;
  202.  
  203. PASdocare    equ    <(bMVA508 OR bMVDAC16 OR bMVOPL3 OR bMV101 )>
  204. PASPLUSdocare    equ    <(bMVA508 OR bMVDAC16 OR bMVOPL3 OR bMV101 )>
  205. PAS16docare    equ    <(bMVA508 OR bMVDAC16 OR bMVOPL3 OR bMV101 )>
  206. CDPCdocare    equ    <(bMVA508 OR bMVDAC16 OR bMVOPL3 OR bMV101 )>
  207.  
  208. ;
  209. ProductIDTable    label    word
  210.     dw    PRODUCT_PROAUDIO and PASdocare
  211.     dw    PRODUCT_PROPLUS  and PASPLUSdocare
  212.     dw    PRODUCT_PRO16     and PAS16docare
  213.     dw    PRODUCT_CDPC     and CDPCdocare
  214.     dw    -1
  215. ;
  216. DoCareBits    label    word
  217.     dw    PASdocare
  218.     dw    PASPLUSdocare
  219.     dw    PAS16docare
  220.     dw    CDPCdocare
  221.     dw    -1                ; table terminator
  222.  
  223.     public    TheDMAChannel        ; defaults to channel 1
  224. TheDMAChannel   db      DEFAULTDMA      ; defaults to channel 1
  225.     public    TheIRQChannel        ; defaults to IRQ 7
  226. TheIRQChannel    db    DEFAULTIRQ    ; defaults to IRQ 7
  227.  
  228. ;
  229. ;---------------------------========================---------------------------
  230. ;---------------------------====< CODE SECTION >====---------------------------
  231. ;---------------------------========================---------------------------
  232. ;
  233.     .code
  234.  
  235.     public    _csMVTranslateCode
  236. _csMVTranslateCode    dw    0    ; I/O base xor default_base
  237.  
  238. ;
  239. ;   /*\
  240. ;---|*|----====< long mvGetHWVersion() >====----
  241. ;---|*|
  242. ;---|*| Detects and identifies the installed Pro AudioSpectrum.
  243. ;---|*|
  244. ;---|*| Entry Conditions:
  245. ;---|*|     word address containing the base address.
  246. ;---|*|
  247. ;---|*| Exit Conditions:
  248. ;---|*|     DX:AX = -1, the hardware is not installed.
  249. ;---|*|     DX:AX = -2, some type of hardware is installed - can't ID it.
  250. ;---|*|     DX      = Product ID
  251. ;---|*|     AH      = PAS hardware version
  252. ;---|*|     AL      = SCSI, or MITSUMI CD-ROM interface installed.
  253. ;---|*|     BX:CX = the bit fields that identify the board
  254. ;---|*|     Carry is set on error
  255. ;---|*|
  256. ;   \*/
  257.  
  258.     public    mvGetHWVersion
  259. mvGetHWVersion    proc
  260.     push    bp            ; frame the stack
  261.     mov    bp,sp
  262.  
  263.     push    si            ; save the C criticals
  264.     push    di
  265. ;
  266. ; calculate the translation code
  267. ;
  268.     mov    di,wParm1        ; get the base I/O address
  269.  
  270.     .errnz    USE_ACTIVE_ADDR
  271.     or    di,di            ; do we search just one?
  272.     jnz    mvgehw_05        ; yes, pass it on...
  273.  
  274.     ; search the default address
  275.  
  276.         mov     di,DEFAULT_BASE         ; try the first address
  277.     call    SearchHWVersion
  278.     cmp    dx,-1            ; found?
  279.     jnz    mvgehw_exit        ; yes, exit now...
  280.  
  281.     ; search the first alternate address
  282.  
  283.     mov    di,ALT_BASE_1        ; try the first alternate
  284.     call    SearchHWVersion
  285.     cmp    dx,-1            ; found?
  286.     jnz    mvgehw_exit        ; yes, exit now...
  287.  
  288.     ; search the second alternate address
  289.  
  290.     mov    di,ALT_BASE_2        ; try the second alternate
  291.     call    SearchHWVersion
  292.     cmp    dx,-1            ; found?
  293.     jnz    mvgehw_exit        ; yes, exit now...
  294.  
  295.     ; search the third, or user requested alternate address
  296.  
  297.     mov    di,ALT_BASE_3        ; try the third alternate
  298. ;
  299. mvgehw_05:
  300.     call    SearchHWVersion     ; pass the third A, or user I/O
  301. ;
  302. mvgehw_exit:
  303.     pop    di
  304.     pop    si
  305.     pop    bp
  306.     ret
  307.  
  308. mvGetHWVersion    endp
  309.  
  310. ;
  311. ;   /*\
  312. ;---|*|----====< SearchHWVersion >====----
  313. ;---|*|
  314. ;---|*| Given a specific I/O address, this routine will see if the
  315. ;---|*| hardware exists at this address.
  316. ;---|*|
  317. ;---|*| Entry Conditions:
  318. ;---|*|     DI holds the I/O address to test
  319. ;---|*|     BX:CX = bMVSCSI
  320. ;---|*|
  321. ;---|*| Exit Conditions:
  322. ;---|*|     BX:CX = the bit fields that identify the board
  323. ;---|*|
  324. ;   \*/
  325. ;
  326. SearchHWVersion proc near
  327.     push    si            ; save the C criticals
  328.     push    di
  329. ;
  330. ; calculate the translation code
  331. ;
  332.     xor    di,DEFAULT_BASE     ; di holds the translation code
  333.  
  334. ifndef NOINT2F
  335.     mov    ax,0BC00H        ; make sure MVSOUND.SYS is loaded
  336.     mov    bx,'??'                 ; this is our way of knowing if the
  337.     xor    cx,cx            ; hardware is actually present.
  338.     xor    dx,dx
  339.     int    2fh            ; get the ID pattern
  340.     xor    bx,cx            ; build the result
  341.     xor    bx,dx
  342.     cmp    bx,'MV'                 ; if not here, exit...
  343.     jjnz    sehw_bad
  344. ;
  345. ; get the MVSOUND.SYS specified DMA and IRQ channel
  346. ;
  347.         mov     ax,0bc04h               ; get the DMA and IRQ numbers
  348.     int    2fh
  349.     mov    TheDMAChannel,bl    ; save the correct DMA & IRQ
  350.     mov    TheIRQChannel,cl
  351. endif
  352.  
  353. ;
  354. ; grab the version # in the interrupt mask. The top few bits hold the version #
  355. ;
  356.         mov     dx,INTRCTLR             ; board ID is in MSB 3 bits
  357.     xor    dx,di            ; adjust to other address
  358.     in    al,dx
  359.     cmp    al,-1            ; bus float meaning not present?
  360.     je    sehw_bad        ; yes, there is no card here
  361.  
  362.     mov    ah,al            ; save an original copy
  363.     xor    al,fICrevbits        ; the top bits wont change
  364.  
  365.     out    dx,al            ; send out the inverted bits
  366.     pause
  367.         pause
  368.     in    al,dx            ; get it back...
  369.  
  370.     cmp    al,ah            ; both should match now...
  371.     xchg    al,ah            ; (restore without touching the flags)
  372.     out    dx,al
  373.  
  374.     jnz    sehw_bad        ; we have a bad board
  375.  
  376.         and     ax,fICrevbits           ; isolate the ID bits & clear AH
  377.     mov    cl,fICrevshr        ; shift the bits into a meaningful
  378.     shr    al,cl            ; position (least signficant bits)
  379.     mov    si,ax            ; save the version #
  380. ;
  381. ; We do have hardware! Load the product bit definitions
  382. ;
  383.     sub    bx,bx
  384.     mov    cx,bMVSCSI        ; setup bx:cx for the original PAS
  385.  
  386.         or      al,al                   ; is this the first version of h/w?
  387.     jz    sehw_done        ; yes, simple exit will do.
  388.  
  389.     call    FindBits        ; load all the rest of the h/w bits
  390. ;
  391. sehw_done:
  392. ;
  393. ; loop on a table search to find identify the board
  394. ;
  395.     push    bx            ; save this high bits
  396.     mov    bx,-2
  397.     ;
  398.     sehw_05:
  399.     add    bx,2
  400.     cmp    ProductIDTable[bx],-1    ; at the end of the table?
  401.     jz    sehw_bad_hw        ; yes, we can't identify this board
  402.     mov    dx,cx            ; dx holds the product bits
  403.     and    dx,DoCareBits[bx]    ; keep the bits we care about
  404.     cmp    dx,ProductIDTable[bx]    ; do these bits match a product?
  405.     jnz    sehw_05         ; no, keep looking
  406.  
  407.     mov    dx,bx
  408.     shr    dx,1            ; make word index a byte index
  409.     pop    bx
  410.  
  411.     mov    [_MVTranslateCode],di       ; save the translation code
  412.     mov    cs:[_csMVTranslateCode],di ; save the translation code
  413.  
  414.     mov    ax,si            ; load the h/w version #
  415.     sub    ah,ah            ; for our purposes, we will return SCSI
  416.     xchg    ah,al            ; into ah
  417.         clc                             ; The board was identified !
  418.  
  419.     mov    [_mvHWVersionBits],cx    ; save the good bits
  420.  
  421.     jmp    short sehw_exit
  422. ;
  423. sehw_bad_hw:
  424.     pop    bx            ; flush the stack
  425.     mov    ax,-2
  426.     cwd
  427.     stc
  428.     jmp    short sehw_exit
  429. ;
  430. sehw_bad:
  431.     mov    ax,-1            ; we got here due to a bad board
  432.     cwd
  433.         stc
  434. ;
  435. sehw_exit:
  436.     pop    di
  437.     pop    si
  438.     ret
  439.  
  440. SearchHWVersion endp
  441.  
  442. ;
  443. ;   /*\
  444. ;---|*|----====< FindBit >====----
  445. ;---|*|
  446. ;---|*| Checks the installed hardware for all the feature bits.
  447. ;---|*|
  448. ;---|*| Entry Conditions:
  449. ;---|*|     DI holds the I/O address translation code
  450. ;---|*|     BX:CX = bMVSCSI
  451. ;---|*|
  452. ;---|*| Exit Conditions:
  453. ;---|*|     BX:CX = the bit fields that identify the board
  454. ;---|*|
  455. ;   \*/
  456. ;
  457.  
  458. FindBits        proc    near
  459. ;
  460. ; All second generation Pro Audio cards use the MV101 and have SB emulation.
  461. ;
  462.     or    cx,bMVSBEMUL+bMV101    ; force SB emulation
  463. ;
  464. ; determine if the enhanced SCSI interface is present
  465. ;
  466.         mov     dx,ENHANCEDSCSI         ; test for SCSI mod (U48)
  467.     xor    dx,di            ; modify via the translate code
  468.  
  469.     out    dx,al            ; strobe
  470.     pause                ; I/O bus delay
  471.     in    al,dx            ; get the bit
  472.  
  473.     and    al,1            ; bit0==1 means old SCSI PAL
  474.     cmp    al,1            ; reverse sense
  475.     sbb    ax,ax            ; ax = ffff if enhanced SCSI
  476.     and    ax,bMVENHSCSI        ; save the bit
  477.     or    cx,ax            ; merge it in
  478. ;
  479. ; determine AT/PS2, CDPC slave mode
  480. ;
  481.     mov    dx,MASTERMODRD        ; check for the CDPC
  482.         xor     dx,di                   ; modify via the translate code
  483.  
  484.         in      al,dx
  485.     test    al,bMMRDatps2        ; AT(1) or PS2(0)
  486.     jnz    @F
  487.     or    cx,bMVPS2
  488.     ;
  489.     @@:
  490.     test    al,bMMRDmsmd        ; Master(0) or Slave(1)
  491.     jz    @F
  492.     or    cx,bMVSLAVE
  493.     ;
  494.     @@:
  495.     push    cx            ; move the revision bits
  496.  
  497.     mov    dx,MASTERCHIPR
  498.     xor    dx,di
  499.  
  500.     .errnz    bMV101_REV-(000Fh SHL 11)
  501.  
  502.     in    al,dx            ; get the low 4 bits of the chip rev
  503.     and    ax,000Fh        ; into ah
  504.     mov    cl,11            ; FROM 0000 0000 0000 1111b
  505.     shl    ax,cl            ; TO   0111 1000 0000 0000b
  506.  
  507.         pop     cx
  508.         or      cx,ax                   ; merge in the bits
  509. ;
  510. ; determine the CDROM drive type, FM chip, 8/16 bit DAC, and mixer
  511. ;
  512.     mov    dx,SLAVEMODRD        ; check for the CDPC
  513.         xor     dx,di                   ; modify via the translate code
  514.     in    al,dx
  515.  
  516.         test    al,bSMRDdactyp          ; 16 bit DAC?
  517.     jz    @F            ; no, its an 8 bit DAC
  518.     or    cx,bMVDAC16        ; its a 16 bit DAC
  519.     ;
  520.     @@:
  521.     test    al,bSMRDfmtyp        ; OPL3 chip?
  522.     jz    @F            ; no, so it's the PAS16 card
  523.     or    cx,bMVOPL3        ; is an OPL3
  524.     ;
  525.     @@:
  526.     mov    dx,cx            ; inference check for new mixer
  527.     and    dx,bMVSLAVE+bMVDAC16    ; Slave & 16 bit dac is the CDPC
  528.     cmp    dx,bMVDAC16        ; 16 bit DAC on master?
  529.     jnz    @F            ; no, it's the CDPC with Nation mixer
  530.     or    cx,bMVA508
  531.     ;
  532.     @@:
  533.     and    al,bSMRDdrvtyp        ; isolate the CDROM drive type
  534.     cmp    al,2            ; Sony 535 interface?
  535.     jnz    @F            ; no, continue on...
  536.     and    cx,NOT (bMVSCSI+bMVENHSCSI) ; yes, flush the SCSI bits
  537.     or    cx,bMVSONY            ; set the 535 bit
  538.     ;
  539.     @@:
  540. ;
  541. ; determine if MPU-401 emulation is active
  542. ;
  543.         mov     dx,COMPATREGE           ; compatibility register
  544.     xor    dx,di            ; modify via translate code
  545.     in    al,dx
  546.     test    al,cpMPUEmulation
  547.     jz    @F
  548.     or    cx,bMVMPUEMUL
  549.     ;
  550.     @@:
  551.     ret
  552.  
  553. FindBits    endp
  554.  
  555.     end
  556.  
  557.